/**
 * 定义DLNA播放器错误码
 */
export enum DlnaErrorCode {
  /**
   * 未知错误
   */
  UNKNOWN_ERROR = 'UNKNOWN_ERROR',
  
  /**
   * 设备未找到
   */
  DEVICE_NOT_FOUND = 'DEVICE_NOT_FOUND',
  
  /**
   * 设备连接失败
   */
  CONNECTION_FAILED = 'CONNECTION_FAILED',
  
  /**
   * 设备断开连接失败
   */
  DISCONNECTION_FAILED = 'DISCONNECTION_FAILED',
  
  /**
   * 无效参数
   */
  INVALID_PARAMETER = 'INVALID_PARAMETER',
  
  /**
   * 播放失败
   */
  PLAYBACK_FAILED = 'PLAYBACK_FAILED',
  
  /**
   * 暂停失败
   */
  PAUSE_FAILED = 'PAUSE_FAILED',
  
  /**
   * 恢复失败
   */
  RESUME_FAILED = 'RESUME_FAILED',
  
  /**
   * 停止失败
   */
  STOP_FAILED = 'STOP_FAILED',
  
  /**
   * 跳转失败
   */
  SEEK_FAILED = 'SEEK_FAILED',
  
  /**
   * 获取播放状态失败
   */
  GET_STATUS_FAILED = 'GET_STATUS_FAILED',
  
  /**
   * 音量控制失败
   */
  VOLUME_CONTROL_FAILED = 'VOLUME_CONTROL_FAILED',
  
  /**
   * 权限错误
   */
  PERMISSION_ERROR = 'PERMISSION_ERROR',
  
  /**
   * 网络错误
   */
  NETWORK_ERROR = 'NETWORK_ERROR',
  
  /**
   * 方法未实现
   */
  METHOD_NOT_IMPLEMENTED = 'METHOD_NOT_IMPLEMENTED',
  
  /**
   * 权限永久拒绝错误
   */
  PERMISSION_PERMANENTLY_DENIED = 'PERMISSION_PERMANENTLY_DENIED',
  
  /**
   * 设备不支持
   */
  DEVICE_NOT_SUPPORTED = 'DEVICE_NOT_SUPPORTED',
  
  /**
   * 正在连接中
   */
  ALREADY_CONNECTING = 'ALREADY_CONNECTING',
  
  /**
   * 操作超时
   */
  TIMEOUT = 'TIMEOUT'
}

/**
 * DLNA播放器错误
 */
export class DlnaError extends Error {
  /**
   * 错误代码
   */
  code: DlnaErrorCode;
  
  /**
   * 详细信息
   */
  details?: any;
  
  /**
   * 构造函数
   * @param code 错误代码
   * @param message 错误消息
   * @param details 详细信息
   */
  constructor(code: DlnaErrorCode, message: string, details?: any) {
    super(message);
    this.name = 'DlnaError';
    this.code = code;
    this.details = details;
    
    // 为了正确的instanceof检查（TypeScript/ES6的类继承问题）
    Object.setPrototypeOf(this, DlnaError.prototype);
  }
  
  /**
   * 创建设备未找到错误
   * @param deviceId 设备ID
   * @param details 详细信息
   * @returns DlnaError实例
   */
  static deviceNotFound(deviceId: string, details?: any): DlnaError {
    return new DlnaError(
      DlnaErrorCode.DEVICE_NOT_FOUND,
      `设备 ${deviceId} 未找到`,
      details
    );
  }
  
  /**
   * 创建连接失败错误
   * @param deviceId 设备ID
   * @param details 详细信息
   * @returns DlnaError实例
   */
  static connectionFailed(deviceId: string, details?: any): DlnaError {
    return new DlnaError(
      DlnaErrorCode.CONNECTION_FAILED,
      `连接设备 ${deviceId} 失败`,
      details
    );
  }
  
  /**
   * 创建无效参数错误
   * @param paramName 参数名称
   * @param message 错误消息
   * @param details 详细信息
   * @returns DlnaError实例
   */
  static invalidParameter(paramName: string, message: string, details?: any): DlnaError {
    return new DlnaError(
      DlnaErrorCode.INVALID_PARAMETER,
      `无效参数 ${paramName}: ${message}`,
      details
    );
  }
  
  /**
   * 创建方法未实现错误
   * @param methodName 方法名称
   * @param details 详细信息
   * @returns DlnaError实例
   */
  static methodNotImplemented(methodName: string, details?: any): DlnaError {
    return new DlnaError(
      DlnaErrorCode.METHOD_NOT_IMPLEMENTED,
      `方法 ${methodName} 未实现`,
      details
    );
  }
  
  /**
   * 创建播放失败错误
   * @param url 视频URL
   * @param details 详细信息
   * @returns DlnaError实例
   */
  static playbackFailed(url: string, details?: any): DlnaError {
    return new DlnaError(
      DlnaErrorCode.PLAYBACK_FAILED,
      `播放 ${url} 失败`,
      details
    );
  }
  
  /**
   * 创建权限错误
   * @param missingPermissions 缺少的权限列表
   * @param message 错误消息
   * @param details 详细信息
   * @returns DlnaError实例
   */
  static permissionError(missingPermissions: string[], message?: string, details?: any): DlnaError {
    return new DlnaError(
      DlnaErrorCode.PERMISSION_ERROR,
      message || `缺少权限: ${missingPermissions.join(', ')}`,
      {
        missingPermissions,
        ...details
      }
    );
  }
  
  /**
   * 创建权限永久拒绝错误
   * @param permanentlyDeniedPermissions 被永久拒绝的权限列表
   * @param message 错误消息
   * @param details 详细信息
   * @returns DlnaError实例
   */
  static permissionPermanentlyDenied(
    permanentlyDeniedPermissions: string[], 
    message?: string, 
    details?: any
  ): DlnaError {
    return new DlnaError(
      DlnaErrorCode.PERMISSION_PERMANENTLY_DENIED,
      message || `权限已被永久拒绝: ${permanentlyDeniedPermissions.join(', ')}。请在系统设置中手动授予权限。`,
      {
        permanentlyDeniedPermissions,
        ...details
      }
    );
  }
  
  /**
   * 创建网络错误
   * @param message 错误消息
   * @param details 错误详情
   * @returns DlnaError 实例
   */
  static networkError(message: string, details?: any): DlnaError {
    return new DlnaError(
      DlnaErrorCode.NETWORK_ERROR,
      message || '网络连接错误',
      details
    );
  }
  
  /**
   * 从原生错误创建DLNA错误
   * @param error 原生错误
   * @returns DlnaError实例
   */
  static fromNativeError(error: any): DlnaError {
    if (error instanceof DlnaError) {
      return error;
    }
    
    // 尝试从错误对象中提取代码和消息
    const code = error.code || DlnaErrorCode.UNKNOWN_ERROR;
    const message = error.message || '未知错误';
    const details = error.details || error;
    
    return new DlnaError(code, message, details);
  }
} 